package ArbolTrie;

import java.util.Iterator;

import Iterador.IteradorSimple;

public interface ITrie<T> {

	/**
     * Busca el elemento del trie cuya representacion en String corresponte a la palabra que llega por parametro. <br>
     * <b> pre: </b> nPalabra!=null. <br>
     * <b> post: </b> Se retorna el elemento del trie cuya representacion en String corresponde a la palabra dada. null de lo contrario
     * @param nPalabra Palabra a ser buscada
     * @return Los elementos del trie cuya cuya representacion en String corresponte a la palabra que llega por parametro. null si no existe tal elemento
     */
    public Iterator<T> buscar( String nPalabra );
    
    /**
     * Busca todos los elementos asociados con el prefijo dado.<br>
     * <b> pre: </b> prefijo!=null. <br>
     * <b> post: </b> Se retorno la lista de elementos que contienen el prefijo dado.
     * @param prefijo El prefijo del que se desean los elementos asociados
     * @return La lista de elementos correspondiente al prefijo dado
     */
    public Iterator<T> buscarPorPrefijo( String prefijo );
	
	/**
	 * Inserta un nuevo elemento al trie <br>
	 * <b> pre: </b> nElemento!=null. <br>
	 * <b> post: </b> Se inserto el la palabra con el elemento dado en el trie.
	 * @param nElemento El elemento a ser insertado en el trie
	 * @throws Exception Si el elemento que se desea agregar no es correcto
	 * @return true si agregado , false de lo contrario
	 */
	public boolean agregar( String nPalabra ,T nElemento ) throws Exception;
	
	/**
	 * Retorna el peso del trie <br>
	 * <b>post: </b> Se retorno el peso del trie
	 * @return El peso del trie
	 */
	public int darPeso( );
	
	/**
	 * Elimina los elementos
	 * @param nombre nobmre de los elementos que toca eliminar
	 * @return Iterador con lo elementos eliminados.
	 */
	public Iterator< T > eleminar ( String nombre );
	
	/**
	 * Elimina los elementos con un sufijo
	 * @param sufijo Sufijo de los elementos a eliminar
	 * @return  Iterador con lo elementos eliminados.
	 */
	public Iterator< T > emliminarPorPrefijo ( String sufijo );
	
	/**
	 * Recorrido en pos orden.
	 * @return Retorna un iterador con lo elementos ordanizados en pos orden.
	 */
	public Iterator < T > recorridoPosOrden ( );
	
	/**
	 * Recorrido en pre orden.
	 * @return Retorna un iterador con lo elementos ordanizados en pre orden.
	 */
	public Iterator < T > recorridoPreOrden ( );
	
	/**
	 * Recorrido en por nievles.
	 * @return Retorna un iterador con lo elementos ordanizados en pos orden.
	 */
	public Iterator < T > recorridoPorNiveles ( );
}
